package com.changgou.pay.service;

import com.changgou.entity.Constants;
import com.changgou.order.pojo.Order;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WeChatPayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 *
 */
@Service
public class PayServiceImpl implements PayService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private WXPay wxPay;

    //回调地址, 是内网穿透服务器的公网地址
    @Value("${wxpay.notify_url}")
    private String notify_url;

    @Override
    public Map nativePay(String userName) throws Exception {

        /**
         * 1. 根据用户名到redis中获取待支付订单对象
         */
        Order order = (Order) redisTemplate.boundValueOps(Constants.REDIS_ORDER_PAY + userName).get();

        /**
         * 2. 封装微信统一下单接口需要的参数
         */
        Map<String,String> paramMap = new HashMap<>();
        paramMap.put("body","畅购");//商品描述
        paramMap.put("out_trade_no", order.getId());//订单号
        //支付金额, 微信支付金额单位是分,下面代码写死, 为支付一分钱,
        // 正常应该使用的代码是: String.valueOf(order.getPayMoney())
        paramMap.put("total_fee", "1");
        paramMap.put("spbill_create_ip","127.0.0.1");//终端IP
        paramMap.put("notify_url", notify_url);//回调地址, 在公网上能够访问的地址, 要么会报错
        paramMap.put("trade_type","NATIVE");//交易类型

        /**
         * 3. 调用微信统一下单接口, 接收返回数据
         */
        Map<String, String> resultMap = wxPay.unifiedOrder(paramMap);

        /**
         * 4. 将订单号, 和 总支付金额数据放入返回的数据中一并返回
         */
        //订单号
        resultMap.put("orderId", order.getId());
        //支付的总金额
        resultMap.put("totalMoney", String.valueOf(order.getPayMoney()));

        return resultMap;
    }

    @Override
    public Map queryPay(String orderId) {
        //封装参数
        Map<String, String> paramMap = new HashMap<>();
        //订单号
        paramMap.put("out_trade_no", orderId);

        try {
            //调用微信查询接口查询支付状态结果
            Map<String, String> resultMap = wxPay.orderQuery(paramMap);
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Map closePay(String orderId) {
        //封装参数
        Map<String, String> paramMap = new HashMap<>();
        //订单号
        paramMap.put("out_trade_no", orderId);

        try {
            //调用微信关闭接口关闭支付通道
            Map<String, String> resultMap = wxPay.closeOrder(paramMap);
            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
